/** * QuickUML; A simple UML tool that demonstrates one use of the Java Diagram Package Copyright (C) 2001 Eric Crahen <crahen@cse.buffalo.edu> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package uml.ui; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.swing.AbstractAction; import javax.swing.Icon; import javax.swing.JOptionPane; import javax.swing.RepaintManager; /** * @class PrintableAction * * @date 08-20-2001 * @author Eric Crahen * @version 1.0 * * Action that provides some generic component printing capabilites */ public abstract class PrintableAction extends AbstractAction implements Printable { /** * Create a new Action */ public PrintableAction(String name, Icon icon) { super(name, icon); } /** * Create a new Action */ public PrintableAction(String name) { super(name); } /** * Get the component to print */ abstract public Component getComponent(); /** * Implement Printable */ public int print(Graphics g, PageFormat pf, int pageIndex) { Component component = getComponent(); // Create a canvas to paint on Graphics2D g2 = (Graphics2D)g; // double x, y; double x; // Check the width of the page being printed if(pf.getOrientation() != PageFormat.LANDSCAPE) x = pageIndex*pf.getImageableWidth(); else x = pageIndex*pf.getImageableHeight(); // If the coords would be out of bounds, there is no page here // TODO, shift back left and down to print the tall pages if(x > component.getWidth()) return Printable.NO_SUCH_PAGE; x += pf.getImageableX(); g2.translate(x, pf.getImageableY()); // Disable buffered for a quick paint into the canvas RepaintManager mgr = RepaintManager.currentManager(component); boolean isBuffered = mgr.isDoubleBufferingEnabled(); mgr.setDoubleBufferingEnabled(false); // Paint component.paint(g2); // Reset buffering mgr.setDoubleBufferingEnabled(isBuffered); return Printable.PAGE_EXISTS; } /** * Display a print dialog */ public void print() throws PrinterException { PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(this); if(job.printDialog()) job.print(); } public void actionPerformed(ActionEvent e) { try { print(); } catch(Throwable t) { JOptionPane.showMessageDialog(getComponent(), t.getMessage(), "Print Error", JOptionPane.ERROR_MESSAGE); } } }